#ifndef LISTECARTECOURRIER_h
#define LISTECARTECOURRIER_h

#include <stdlib.h>
#include <stdio.h>
#include "carte.h"

/**
@brief Cette fonction définit le module listecarte
@author MARLIER Molly & GUESDON Marine
@version 1.0
@date 2013/03/26
*/


typedef struct {
CarteCourrier info;
struct CelluleCourrier *suivant;
struct CelluleCourrier *precedent;
} CelluleCourrier;


typedef struct sListeC{
  CelluleCourrier *prem;
  CelluleCourrier *last;
} ListeCourrier;

/**
@brief InitialiserListe permet d'initialiser la liste pour qu'elle soit vide.
@param [in] l: pointeur sur liste.
@return none.
*/
void initialiserListeC(ListeCourrier * l);

/**
@brief ImplementeListeC permet de remplir la pioche avec les cartes que nous avons choisi.
@param [in] l: pointeur sur liste.
@return none.
*/
void ImplementeListeC (ListeCourrier *l);

/**
@brief AjouterEnTeteListe aoute une carte en tête de la liste.
@param [in] l: pointeur sur liste, [in] c:Carte.
@return none.
*/
/* Precondition : l et e initialises et manipules uniquement a travers les operations de leurs modules respectifs*/
void AjouterEnTeteListeC(CarteCourrier c,ListeCourrier * l);

/**
@brief AjouterEnQueueListe ajoute une carte en queue de liste.
@param [in] l: pointeur sur liste, [in] c:Carte.
@return none.
*/
/* Precondition : l et e initialises et manipules uniquement a travers les operations de leurs modules respectifs */
void AjouterEnQueueListeC(CarteCourrier c, ListeCourrier * l);

/**
@brief SupprimerTeteListe
@param [in] l: pointeur sur liste, [in] c:Carte.
@return none.
*/
/* Precondition : l n'est pas vide*/
void supprimerTeteListeC(ListeCourrier * l);

/**
@brief EstVideListe permet de teste si la liste est vide: renvoi 1 si elle l'est 0 sinon
@param [in,out] l: pointeur sur liste,
@return int
*/
int EstVideListeC(const ListeCourrier * l);

/**
@brief RecupererPremiereCarte permet de piocher la première carte du paquet
@param [in] l: pointeur sur liste
@return Carte
*/
CarteCourrier RecupererPremiereCarteC (ListeCourrier *l);


#endif
